/*************************************************************************
  > File Name: 6stat.c
  > Author: Ykk
  > Mail: 3393579535@qq.com 
  > Created Time: 2023年04月01日 星期六 17时26分19秒
 ************************************************************************/

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>

//显示文件类型的第二种方式
int show_file_type(struct stat *s)
{
	//普通文件
	if(S_ISREG(s->st_mode))
	{
		printf("Is a regular file \n");
	}
	//目录
	if(S_ISDIR(s->st_mode))
	{
		printf("Is a directory \n");
	}
	//字符设备
	if(S_ISCHR(s->st_mode))
	{
		printf("Is a character device \n");
	}
	//块设备
	if(S_ISBLK(s->st_mode))
	{
		printf("Is a block device \n");
	}
	//符号链接
	if(S_ISLNK(s->st_mode))
	{
		printf("Is a symbolic link\n");
	}
	//管道文件
	if(S_ISFIFO(s->st_mode))
	{
		printf("Is a FIFO \n");
	}
	//套接字
	if(S_ISSOCK(s->st_mode))
	{
		printf("Is a socket \n");
	}
}

//显示文件权限rwx
int show_permisson(struct stat *s)
{
	//判断文件所属者读权限
	if(s->st_mode&S_IRUSR)
	{
		printf("r");
	}
	else
	{
		printf("-");
	}

	//判断文件所属者写权限
	if(s->st_mode&S_IWUSR)
	{
		printf("w");
	}
	else
	{
		printf("-");
	}

	//判断文件所属者执行权限
	if(s->st_mode&S_IXUSR)
	{
		printf("x");
	}
	else
	{
		printf("-");
	}

	//判断文件所属组读权限
	if(s->st_mode&S_IRGRP)
	{
		printf("r");
	}
	else
	{
		printf("-");
	}

	//判断文件所属组写权限
	if(s->st_mode&S_IWGRP)
	{
		printf("w");
	}
	else
	{
		printf("-");
	}

	//判断文件所属组执行权限
	if(s->st_mode&S_IXGRP)
	{
		printf("x");
	}
	else
	{
		printf("-");
	}

	//判断文件所属其他用户的读权限
	if(s->st_mode&S_IROTH)
	{
		printf("r");
	}
	else
	{
		printf("-");
	}

	//判断文件所属其他用户的写权限
	if(s->st_mode&S_IWOTH)
	{
		printf("w");
	}
	else
	{
		printf("-");
	}

	//判断文件所属其他用户的执行权限
	if(s->st_mode&S_IXOTH)
	{
		printf("x");
	}
	else
	{
		printf("-");
	}

	printf("\n");
	return 0;
}
int main(int argc, char **argv)
{
	int ret = -1;
	struct stat s;

	//获取文件信息
	ret =stat("txt",&s);

	//容错判断
	if(2!=argc)
	{
		printf("usage: ./a.out filename ");
		return 1;
	}

	//获取文件信息
	ret = stat(argv[1],&s);
	if(-1 == ret)
	{
		perror("stat");
		return 1;
	}

	//显示文件的类型
	show_file_type(&s);
	show_permisson(&s);

	return 0;
}
